# 【一】遍历文档树
# 获取到标签对象 在标签对象的基础上操作标签的属性和属性值
# 【二】搜索文档树
# 通过指定的语法在全局的 soup 对象中 定位到指定的内容

from bs4 import BeautifulSoup

soup = BeautifulSoup(open("html_doc.html", "r").read(), "lxml")

# 【1】 查找指定的多个标签.find_all()
# soup.find_all()
'''
find_all(self, name=None, attrs={}, recursive=True, string=None,limit=None, **kwargs):
'''
# (1) name参数之方式一：直接方指定的标签名
# print(soup.find_all(name="a"))

# (2) name参数之方式二：通过正则表达式
import re

# print(soup.find_all(name=re.compile("^b")))

# （3）name参数之方式三：可以放一个列表，列表里面放标签名或者正则表达式
# print(soup.find_all(name=["a", re.compile("^b")]))

# （4）name参数之方式四：一个方法，在方法中指定需要的标签规则
# print(soup.find_all(name=lambda x: x.has_attr("class") and not x.has_attr("id")))

# （5）name参数之方式五：放布尔值
# print([tag.name for tag in soup.find_all(name=True)])

# （6）kwargs参数可以按照指定属性值进行搜索
# 方式一：属于名=固定属性值
# print(soup.find_all(id="link4"))
# 方式二：属性名=正则表达式
# print(soup.find_all(href=re.compile("^https://")))
# 方式三：多个属性值同时生效
# print(soup.find_all(href=re.compile("^http://"), id="link3"))

# （7）string 参数：按照指定文本进行查找标签
# print(soup.find_all(string="Elsie"))
# （8）limit 限制当前结果的条数
# print(soup.find_all("a",limit=1))

# （9）recursive 是否递归向下查询
# print(soup.find_all("p",recursive=True))


# 【2】查找指定的单个标签 .find()
# 自带一个 limit = 1 限制只拿一条数据
# soup.find()


# 【3】 find_parents() 和 find_parent()
# 当前标签的父元素
# print(soup.find_all("a")[1].find_parent())
# print(soup.find_all("a")[1].find_parents())


# 【4】find_next_sibling 和 find_next_siblings
# 找当前标签的下一个兄弟元素
# print(soup.find_all("a")[0].find_next_sibling())
# 找当前标签的下面所有的兄弟元素
# print(soup.find_all("a")[0].find_next_siblings())

# 【5】find_previous_sibling 和 find_previous_siblings
# 找当前标签的上面一个兄弟元素
# print(soup.find_all("a")[2].find_previous_sibling())
# 找当前标签的上面所有的兄弟元素
# print(soup.find_all("a")[2].find_previous_siblings())

# 【6】find_next 和 find_all_next
# 找到当前标签的下一个标签
print(soup.find(string="Elsie").find_next())
# 当前标签下面的所有标签
print(soup.find(string="Elsie").find_all_next())
